#include <app.h>
#include <u_syscall.h>

APP_INFO appInfo[MAX_APP_NUM] = {0};
U16 appNum = 0;

E_RET AppRegister(APP_FUNC pFunc, U08* stackAddr, U16 stackSize, U08* name, E_APP_PRI priority)
{
    if(appNum >= MAX_APP_NUM)
        return E_ERR;

    appInfo[appNum].pfunc = pFunc;
    appInfo[appNum].stackAddr = stackAddr;
    appInfo[appNum].stackSize = stackSize;
    appInfo[appNum].name = name;
    appInfo[appNum].priority = priority;
    appNum++;

    return E_OK;
}

/******************************************************************************
* 函数名称: static void TaskIdleFunc(void)
* 功能说明: 空闲任务
* 输入参数: 无
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
#define IDLE_STACK_SIZE   512     
static U08 taskIdle_stack[IDLE_STACK_SIZE];    // 空闲任务私有栈
static void TaskIdleFunc(void)                 // 空闲任务执行函数
{
    static U32 count = 0;
    while(1)
    {
        ;
    }
}

MUTEX* gMutex = NULL;
U08 taskA_stack[512];   // 任务私有栈
void TaskAFunc(void)    // 任务执行函数
{
    gMutex = MutexCreat();
    MutexLock(gMutex);
    for(int i = 0; i < 10; i++)
    {
        print("a"); 
        {volatile U32 cnt = 999999; while(cnt--);}
    }
    MutexUnLock(gMutex);
}

U08 taskB_stack[512];   // 任务私有栈
void TaskBFunc(void)    // 任务执行函数
{
    while(1)
    {
        MutexLock(gMutex);
        for(int i = 0; i < 4; i++)
        {
            print("b"); 
            {volatile U32 cnt = 999999; while(cnt--);}
        }
        MutexUnLock(gMutex);
    }
}


void AppInit(void)
{
    AppRegister(TaskAFunc, taskA_stack, 512, "TASK A", E_APP_PRI5);
    AppRegister(TaskBFunc, taskB_stack, 512, "TASK B", E_APP_PRI7);

    // 把应用数据放入共享内存 0xA800 处
    *((volatile U32*)0xA800) = (U32)appInfo;
    *((volatile U32*)0xA804) = appNum;
    *((volatile U32*)0xA808) = (U32)taskIdle_stack;
    *((volatile U32*)0xA80C) = IDLE_STACK_SIZE;
    *((volatile U32*)0xA810) = (U32)TaskIdleFunc;
}
